package com.dy.utils;

import com.dy.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @program: xg-parent
 * @description: 递归构建树形菜单
 * @author: dy
 * @create: 2022-03-03 19:28
 **/
public class MenuTreeBuilder {

    public static List<Menu> build(List<Menu> rootMenu) {
        //2.查看一下有没有获取到菜单
        rootMenu.forEach(menu -> {
            System.out.println(menu.toString());
        });

        //3.定义一个最后的结果来存储菜单树
        List<Menu> menuList = new ArrayList<Menu>();

        //4.先查询一级菜单
        for (Menu menu : rootMenu) {
            if (menu.getParentId() == 0) {
                //把一级菜单加入到菜单树中
                menuList.add(menu);
            }
        }
        //为一级菜单排序
        Collections.sort(menuList, Menu.order());
        //5.为一级菜单设置子菜单
        for (Menu menu : menuList) {
            //这里需要通过递归的方法去设置子菜单(因为子菜单中可能还有子菜单)
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }

        return menuList;
    }


    private static List<Menu> getChild(Long id, List<Menu> rootMenu) {
        // 2级子菜单
        List<Menu> childList = new ArrayList<>();
        // 遍历所有节点，将父菜单id与传过来的id比较
        for (Menu menu : rootMenu) {
            //且Type类型必须是菜单类型 type=0
            if (menu.getParentId().equals(id) && menu.getType().equals("0")) {
                childList.add(menu);
            }
        }

        //2级以上的子菜单
        for (Menu menu : childList) {
            menu.setChildMenus(getChild(menu.getId(), rootMenu));
        }

        //为二级及以上的菜单排序
        Collections.sort(childList, Menu.order());

        //半段递归结束的条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
}
